using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.Linq;
using Avalonia.Platform;

namespace AvaAI批量点评系统.Services;

public class CourseIntroductionService
{
    private readonly Dictionary<string, string> _courseIntroductions;
    private readonly string _introductionResourcePath = "avares://AvaAI批量点评系统/Assets/课程介绍.txt";
    private readonly string _externalIntroductionPath = "课程介绍.txt";

    public CourseIntroductionService()
    {
        _courseIntroductions = new Dictionary<string, string>();
        LoadCourseIntroductions();
    }

    private void LoadCourseIntroductions()
    {
        try
        {
            string content = "";

            // 优先尝试读取程序目录下的外部文件
            if (File.Exists(_externalIntroductionPath))
            {
                Console.WriteLine("✅ 找到外部课程介绍文件，使用外部文件");
                content = File.ReadAllText(_externalIntroductionPath, System.Text.Encoding.UTF8);
            }
            else
            {
                // 如果外部文件不存在，则读取内置资源
                Console.WriteLine("📦 使用内置课程介绍文件");
                using var stream = AssetLoader.Open(new Uri(_introductionResourcePath));
                using var reader = new StreamReader(stream);
                content = reader.ReadToEnd();
            }

            ParseCourseIntroductions(content);
            Console.WriteLine($"📚 成功加载了 {_courseIntroductions.Count} 个课程介绍");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ 加载课程介绍文件失败: {ex.Message}");
            // 创建一个默认的示例文件
            CreateDefaultCourseIntroductionFile();
        }
    }

    private void CreateDefaultCourseIntroductionFile()
    {
        try
        {
            // 创建一个简单的示例文件，避免复杂的字符串转义问题
            var defaultLines = new[]
            {
                "\"本学期学生们通过参与各种编程项目，探索了计算机科学和编程的领域。在编程基础知识方面，学生们学习了GESP等级考试一级的内容、包含最基本的语法，语句结构的综合应用。他们通过编写代码，解决问题，实现了一系列有趣的项目，一步一步的完成着考点大纲的任务。这些项目不仅让孩子们掌握了编程的基本技能，还培养了他们的创造力和解决问题的能力。\" #0-python编程",
                "\"本学期的趣味编程基础班课程内容丰富，采用PBL项目制教学法，激发孩子自主学习和解决问题的能力。学生在轻松愉悦的课堂氛围中进行编程学习，通过制作一系列有趣的游戏作品，学习图层、变量、画笔、列表和克隆等知识。学生在完成项目的过程中，逐渐掌握知识点，并且学习如何将一个大项目拆分成一个个小问题，通过解决小问题，一步一步的完成每节课的任务，熟练运用编程指令创作出丰富有趣的编程作品，进而培养学生的逻辑思维、解决问题的能力和创新思维。\" #1-趣味编程基础班",
                "\"本学期的编程课程是采用理论学习加动手编程的方式学习，在边玩边学的过程中引导学生积极思考，理解程序，完成作品。本课程内容是基于小学阶段学生年龄特点和认知规律进行编排，每个主题内容从趣味的项目入手，如太空逃生、打砖块、躲避盒子、飞机大战等作品，通过项目制的任务创作，逐步分析拆解，借助编程软件工具完成作品，引导学生养成观察思考、动手编程、总结分析等严谨的程序编写习惯。\" #2-趣味编程提高班"
            };

            var defaultContent = string.Join("\n", defaultLines);

            File.WriteAllText(_externalIntroductionPath, defaultContent, System.Text.Encoding.UTF8);
            Console.WriteLine($"📝 已创建默认课程介绍文件: {_externalIntroductionPath}");
            
            // 解析新创建的内容
            ParseCourseIntroductions(defaultContent);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ 创建默认课程介绍文件失败: {ex.Message}");
        }
    }

    private void ParseCourseIntroductions(string content)
    {
        // 使用正则表达式解析课程介绍
        // 格式: "课程介绍内容" #编号-课程名称
        var pattern = @"""([^""]+)""\s*#\d+-(.+)";
        var matches = Regex.Matches(content, pattern);

        foreach (Match match in matches)
        {
            if (match.Groups.Count >= 3)
            {
                var introduction = match.Groups[1].Value.Trim();
                var courseName = match.Groups[2].Value.Trim();
                
                _courseIntroductions[courseName] = introduction;
                
                // 添加一些常见的课程名称变体
                AddCourseVariants(courseName, introduction);
            }
        }
    }

    private void AddCourseVariants(string courseName, string introduction)
    {
        // 为常见的课程名称添加变体，提高匹配成功率
        var variants = new List<string>();
        
        if (courseName.Contains("python") || courseName.Contains("Python"))
        {
            variants.Add("Python");
            variants.Add("GESP-Python");
            variants.Add("python编程");
        }
        
        if (courseName.Contains("scratch") || courseName.Contains("Scratch"))
        {
            variants.Add("Scratch");
            variants.Add("GESP-Scratch");
            variants.Add("图形化编程");
        }
        
        if (courseName.Contains("乐高"))
        {
            variants.Add("乐高机器人搭建");
            variants.Add("乐高搭建");
            variants.Add("机器人搭建");
        }
        
        if (courseName.Contains("科学实验"))
        {
            variants.Add("科学实验");
            variants.Add("实验课");
        }
        
        if (courseName.Contains("思维"))
        {
            variants.Add("趣味思维");
            variants.Add("思维训练");
        }
        
        if (courseName.Contains("3D打印"))
        {
            variants.Add("3D打印笔模型设计");
            variants.Add("3D打印");
        }
        
        if (courseName.Contains("创意创客"))
        {
            variants.Add("创意创客电路");
            variants.Add("创客电路");
        }
        
        if (courseName.Contains("车航模"))
        {
            variants.Add("车航模");
            variants.Add("航模");
        }
        
        if (courseName.Contains("智能穿越"))
        {
            variants.Add("智能穿越机器人");
            variants.Add("穿越机器人");
        }

        foreach (var variant in variants)
        {
            if (!_courseIntroductions.ContainsKey(variant))
            {
                _courseIntroductions[variant] = introduction;
            }
        }
    }

    /// <summary>
    /// 根据课程名称获取课程介绍
    /// </summary>
    /// <param name="courseName">课程名称</param>
    /// <returns>课程介绍，如果未找到返回默认介绍</returns>
    public string GetCourseIntroduction(string courseName)
    {
        if (string.IsNullOrEmpty(courseName))
        {
            return GetDefaultIntroduction();
        }

        // 直接匹配
        if (_courseIntroductions.TryGetValue(courseName, out var introduction))
        {
            return introduction;
        }

        // 模糊匹配
        foreach (var kvp in _courseIntroductions)
        {
            if (courseName.Contains(kvp.Key) || kvp.Key.Contains(courseName))
            {
                return kvp.Value;
            }
        }

        // 返回默认介绍
        return GetDefaultIntroduction(courseName);
    }

    /// <summary>
    /// 获取所有可用的课程名称
    /// </summary>
    /// <returns>课程名称列表</returns>
    public List<string> GetAllCourseNames()
    {
        return new List<string>(_courseIntroductions.Keys);
    }

    /// <summary>
    /// 检查是否有指定课程的介绍
    /// </summary>
    /// <param name="courseName">课程名称</param>
    /// <returns>是否存在</returns>
    public bool HasCourseIntroduction(string courseName)
    {
        if (string.IsNullOrEmpty(courseName)) return false;
        
        return _courseIntroductions.ContainsKey(courseName) || 
               _courseIntroductions.Keys.Any(key => courseName.Contains(key) || key.Contains(courseName));
    }

    private string GetDefaultIntroduction(string courseName = "")
    {
        if (string.IsNullOrEmpty(courseName))
        {
            return "本学期的课程注重理论学习与实践操作并重，创新思维与技能培养结合的教学理念，为学生提供丰富多彩的学习体验。我们致力于在快乐学习的氛围中培养学生的综合素质和创新能力。";
        }
        
        return $"本学期的{courseName}课程注重理论学习与实践操作并重，创新思维与技能培养结合的教学理念，为学生提供丰富多彩的学习体验。我们致力于在快乐学习的氛围中培养学生的综合素质和创新能力。";
    }

    /// <summary>
    /// 重新加载课程介绍（热重载功能）
    /// </summary>
    /// <returns>加载结果信息</returns>
    public string ReloadCourseIntroductions()
    {
        try
        {
            _courseIntroductions.Clear();
            LoadCourseIntroductions();
            return $"✅ 课程介绍重新加载成功！共加载了 {_courseIntroductions.Count} 个课程介绍。";
        }
        catch (Exception ex)
        {
            return $"❌ 重新加载课程介绍失败: {ex.Message}";
        }
    }

    /// <summary>
    /// 获取课程介绍文件的路径信息
    /// </summary>
    /// <returns>文件路径信息</returns>
    public string GetCourseIntroductionFilePath()
    {
        if (File.Exists(_externalIntroductionPath))
        {
            return $"外部文件: {Path.GetFullPath(_externalIntroductionPath)}";
        }
        else
        {
            return $"内置资源: {_introductionResourcePath}";
        }
    }
} 